home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1998 January: Mac OS SDK / Dev.CD Jan 98 SDK1.toast / Development Kits (Disc 1) / QuickDraw 3D / Samples / SampleCode / Unsupported Libraries / Error_MesgLib.c < prev    next >
Encoding:
C/C++ Source or Header  |  1997-08-14  |  15.0 KB  |  365 lines  |  [TEXT/MPS ]

  1. /******************************************************************************
  2.  **                                                                             **
  3.  **     Module:        Error_MesgLib.c                                             **
  4.  **                                                                          **
  5.  **                                                                          **
  6.  **     Purpose:                                                               **
  7.  **                                                                          **
  8.  **                                                                          **
  9.  **     Copyright (C) 1992, 1993 Apple Computer, Inc.  All rights reserved.     **
  10.  **                                                                          **
  11.  **                                                                          **
  12.  *****************************************************************************/
  13.  
  14. #include <assert.h>
  15. #include "QD3D.h"
  16. #include "QD3DErrors.h"
  17.  
  18. #include "Error_MesgLib.h"
  19.  
  20. typedef struct ErrorLookup {
  21.     struct ErrorLookup         *lookup;
  22.     long                    errorCode;
  23.     char                    *errorString;
  24. } ErrorLookup;
  25.  
  26. /*
  27.     To generate these tables, copy/paste the error codes from QD3DErrors.h
  28.     and use this regexp:
  29.     
  30.     Find:        kQ3Error([0-9A-z]*),
  31.     Replace:    NULL, kQ3Error\1, "kQ3Error\1",
  32.     
  33.     Find:        kQ3Warning([0-9A-z]*),
  34.     Replace:    NULL, kQ3Warning\1, "kQ3Warning\1",
  35.     
  36.     Find:        kQ3Notice([0-9A-z]*),
  37.     Replace:    NULL, kQ3Notice\1, "kQ3Notice\1",
  38.     
  39.     Don't forget to add NULL, 0, NULL at the end of each list
  40. */
  41.  
  42. static unsigned long    gNumErrors = 0;
  43. static ErrorLookup         gErrorLookup[] =
  44. {
  45.     NULL, kQ3ErrorNone,    "kQ3ErrorNone",
  46.     /* Fatal Errors */
  47.     NULL, kQ3ErrorInternalError, "kQ3ErrorInternalError",
  48.     NULL, kQ3ErrorNoRecovery, "kQ3ErrorNoRecovery",                    /* TODO: This is not used correctly */
  49.     NULL, kQ3ErrorLastFatalError, "kQ3ErrorLastFatalError",
  50.     /* System Errors */
  51.     NULL, kQ3ErrorNotInitialized, "kQ3ErrorNotInitialized",
  52.     NULL, kQ3ErrorAlreadyInitialized, "kQ3ErrorAlreadyInitialized",
  53.     NULL, kQ3ErrorUnimplemented, "kQ3ErrorUnimplemented",
  54.     NULL, kQ3ErrorRegistrationFailed, "kQ3ErrorRegistrationFailed",
  55.     /* OS Errors */
  56.     NULL, kQ3ErrorUnixError, "kQ3ErrorUnixError",
  57.     NULL, kQ3ErrorMacintoshError, "kQ3ErrorMacintoshError",
  58.     NULL, kQ3ErrorX11Error, "kQ3ErrorX11Error",
  59.     /* Memory Errors */
  60.     NULL, kQ3ErrorMemoryLeak, "kQ3ErrorMemoryLeak",
  61.     NULL, kQ3ErrorOutOfMemory, "kQ3ErrorOutOfMemory",
  62.     /* Parameter errors */
  63.     NULL, kQ3ErrorNULLParameter, "kQ3ErrorNULLParameter",
  64.     NULL, kQ3ErrorParameterOutOfRange, "kQ3ErrorParameterOutOfRange",
  65.     NULL, kQ3ErrorInvalidParameter, "kQ3ErrorInvalidParameter",            /* TODO: Make this more specific */
  66.     NULL, kQ3ErrorInvalidData, "kQ3ErrorInvalidData",                /* TODO: Is this used? */
  67.     NULL, kQ3ErrorAcceleratorAlreadySet, "kQ3ErrorAcceleratorAlreadySet",        /* TODO: Is this used? */
  68.     NULL, kQ3ErrorVector3DNotUnitLength, "kQ3ErrorVector3DNotUnitLength",
  69.     NULL, kQ3ErrorVector3DZeroLength, "kQ3ErrorVector3DZeroLength",
  70.     /* Object Errors */
  71.     NULL, kQ3ErrorInvalidObject, "kQ3ErrorInvalidObject",
  72.     NULL, kQ3ErrorInvalidObjectClass, "kQ3ErrorInvalidObjectClass",
  73.     NULL, kQ3ErrorInvalidObjectType, "kQ3ErrorInvalidObjectType",
  74.     NULL, kQ3ErrorInvalidObjectName, "kQ3ErrorInvalidObjectName",
  75.     NULL, kQ3ErrorObjectClassInUse, "kQ3ErrorObjectClassInUse",            
  76.     NULL, kQ3ErrorAccessRestricted, "kQ3ErrorAccessRestricted",
  77.     NULL, kQ3ErrorMetaHandlerRequired, "kQ3ErrorMetaHandlerRequired",
  78.     NULL, kQ3ErrorNeedRequiredMethods, "kQ3ErrorNeedRequiredMethods",
  79.     NULL, kQ3ErrorNoSubClassType, "kQ3ErrorNoSubClassType",
  80.     NULL, kQ3ErrorUnknownElementType, "kQ3ErrorUnknownElementType",
  81.     NULL, kQ3ErrorNotSupported, "kQ3ErrorNotSupported",
  82.     /* Extension Errors */
  83.     NULL, kQ3ErrorNoExtensionsFolder, "kQ3ErrorNoExtensionsFolder",
  84.     NULL, kQ3ErrorExtensionError, "kQ3ErrorExtensionError",
  85.     NULL, kQ3ErrorPrivateExtensionError, "kQ3ErrorPrivateExtensionError",
  86.     /* Geometry Errors */
  87.     NULL, kQ3ErrorDegenerateGeometry, "kQ3ErrorDegenerateGeometry",
  88.     NULL, kQ3ErrorGeometryInsufficientNumberOfPoints, "kQ3ErrorGeometryInsufficientNumberOfPoints",
  89.     /* IO Errors */
  90.     NULL, kQ3ErrorNoStorageSetForFile, "kQ3ErrorNoStorageSetForFile",
  91.     NULL, kQ3ErrorEndOfFile, "kQ3ErrorEndOfFile",
  92.     NULL, kQ3ErrorFileCancelled, "kQ3ErrorFileCancelled",
  93.     NULL, kQ3ErrorInvalidMetafile, "kQ3ErrorInvalidMetafile",
  94.      NULL, kQ3ErrorInvalidMetafilePrimitive, "kQ3ErrorInvalidMetafilePrimitive",
  95.      NULL, kQ3ErrorInvalidMetafileLabel, "kQ3ErrorInvalidMetafileLabel",
  96.      NULL, kQ3ErrorInvalidMetafileObject, "kQ3ErrorInvalidMetafileObject",
  97.      NULL, kQ3ErrorInvalidMetafileSubObject, "kQ3ErrorInvalidMetafileSubObject",
  98.     NULL, kQ3ErrorInvalidSubObjectForObject, "kQ3ErrorInvalidSubObjectForObject",
  99.     NULL, kQ3ErrorUnresolvableReference, "kQ3ErrorUnresolvableReference",
  100.     NULL, kQ3ErrorUnknownObject, "kQ3ErrorUnknownObject",
  101.     NULL, kQ3ErrorStorageInUse, "kQ3ErrorStorageInUse",
  102.     NULL, kQ3ErrorStorageAlreadyOpen, "kQ3ErrorStorageAlreadyOpen",
  103.     NULL, kQ3ErrorStorageNotOpen, "kQ3ErrorStorageNotOpen",
  104.     NULL, kQ3ErrorStorageIsOpen, "kQ3ErrorStorageIsOpen",
  105.     NULL, kQ3ErrorFileAlreadyOpen, "kQ3ErrorFileAlreadyOpen",
  106.     NULL, kQ3ErrorFileNotOpen, "kQ3ErrorFileNotOpen",
  107.     NULL, kQ3ErrorFileIsOpen, "kQ3ErrorFileIsOpen",
  108.     NULL, kQ3ErrorBeginWriteAlreadyCalled, "kQ3ErrorBeginWriteAlreadyCalled",
  109.     NULL, kQ3ErrorBeginWriteNotCalled, "kQ3ErrorBeginWriteNotCalled",
  110.     NULL, kQ3ErrorEndWriteNotCalled, "kQ3ErrorEndWriteNotCalled",
  111.     NULL, kQ3ErrorReadStateInactive, "kQ3ErrorReadStateInactive",
  112.     NULL, kQ3ErrorStateUnavailable, "kQ3ErrorStateUnavailable",
  113.     NULL, kQ3ErrorWriteStateInactive, "kQ3ErrorWriteStateInactive",
  114.     NULL, kQ3ErrorSizeNotLongAligned, "kQ3ErrorSizeNotLongAligned",
  115.     NULL, kQ3ErrorFileModeRestriction, "kQ3ErrorFileModeRestriction",
  116.     NULL, kQ3ErrorInvalidHexString, "kQ3ErrorInvalidHexString",
  117.     NULL, kQ3ErrorWroteMoreThanSize, "kQ3ErrorWroteMoreThanSize",
  118.     NULL, kQ3ErrorWroteLessThanSize, "kQ3ErrorWroteLessThanSize",
  119.     NULL, kQ3ErrorReadLessThanSize, "kQ3ErrorReadLessThanSize",
  120.     NULL, kQ3ErrorReadMoreThanSize, "kQ3ErrorReadMoreThanSize",
  121.     NULL, kQ3ErrorNoBeginGroup, "kQ3ErrorNoBeginGroup",    /* was missing! */
  122.     NULL, kQ3ErrorSizeMismatch, "kQ3ErrorSizeMismatch",
  123.     NULL, kQ3ErrorStringExceedsMaximumLength, "kQ3ErrorStringExceedsMaximumLength",
  124.     NULL, kQ3ErrorValueExceedsMaximumSize, "kQ3ErrorValueExceedsMaximumSize",
  125.     NULL, kQ3ErrorNonUniqueLabel, "kQ3ErrorNonUniqueLabel",
  126.     NULL, kQ3ErrorEndOfContainer, "kQ3ErrorEndOfContainer", /* was missing! */
  127.     NULL, kQ3ErrorUnmatchedEndGroup, "kQ3ErrorUnmatchedEndGroup",
  128.     NULL, kQ3ErrorFileVersionExists, "kQ3ErrorFileVersionExists",
  129.     /* View errors */
  130.     NULL, kQ3ErrorViewNotStarted, "kQ3ErrorViewNotStarted",
  131.     NULL, kQ3ErrorViewIsStarted, "kQ3ErrorViewIsStarted",
  132.     NULL, kQ3ErrorRendererNotSet, "kQ3ErrorRendererNotSet",
  133.     NULL, kQ3ErrorRenderingIsActive, "kQ3ErrorRenderingIsActive",
  134.     NULL, kQ3ErrorImmediateModeUnderflow, "kQ3ErrorImmediateModeUnderflow",
  135.     NULL, kQ3ErrorDisplayNotSet, "kQ3ErrorDisplayNotSet",
  136.     NULL, kQ3ErrorCameraNotSet, "kQ3ErrorCameraNotSet",
  137.     NULL, kQ3ErrorDrawContextNotSet, "kQ3ErrorDrawContextNotSet",
  138.     NULL, kQ3ErrorNonInvertibleMatrix, "kQ3ErrorNonInvertibleMatrix",
  139.     NULL, kQ3ErrorRenderingNotStarted, "kQ3ErrorRenderingNotStarted",
  140.     NULL, kQ3ErrorPickingNotStarted, "kQ3ErrorPickingNotStarted",
  141.     NULL, kQ3ErrorBoundsNotStarted, "kQ3ErrorBoundsNotStarted",
  142.     NULL, kQ3ErrorDataNotAvailable, "kQ3ErrorDataNotAvailable",
  143.     NULL, kQ3ErrorNothingToPop, "kQ3ErrorNothingToPop",
  144.     /* Renderer Errors */
  145.     NULL, kQ3ErrorUnknownStudioType, "kQ3ErrorUnknownStudioType",            /* TODO Name Change */
  146.     NULL, kQ3ErrorAlreadyRendering, "kQ3ErrorAlreadyRendering",
  147.     NULL, kQ3ErrorStartGroupRange, "kQ3ErrorStartGroupRange",
  148.     NULL, kQ3ErrorUnsupportedGeometryType, "kQ3ErrorUnsupportedGeometryType",
  149.     NULL, kQ3ErrorInvalidGeometryType, "kQ3ErrorInvalidGeometryType",
  150.     NULL, kQ3ErrorUnsupportedFunctionality, "kQ3ErrorUnsupportedFunctionality",
  151.     /* Group Errors */
  152.     NULL, kQ3ErrorInvalidPositionForGroup, "kQ3ErrorInvalidPositionForGroup",
  153.     NULL, kQ3ErrorInvalidObjectForGroup, "kQ3ErrorInvalidObjectForGroup",
  154.     NULL, kQ3ErrorInvalidObjectForPosition, "kQ3ErrorInvalidObjectForPosition",
  155.     /* Transform Errors */
  156.     NULL, kQ3ErrorScaleOfZero, "kQ3ErrorScaleOfZero",                /* Transform errors? */
  157.     /* String Errors */
  158.     NULL, kQ3ErrorBadStringType, "kQ3ErrorBadStringType",                /* What is this? */
  159.     /* Attribute Errors */
  160.     NULL, kQ3ErrorAttributeNotContained, "kQ3ErrorAttributeNotContained",        /* What is this? */
  161.     NULL, kQ3ErrorAttributeInvalidType, "kQ3ErrorAttributeInvalidType",        /* What is this? */
  162.     /* Camera Errors */
  163.     NULL, kQ3ErrorInvalidCameraValues, "kQ3ErrorInvalidCameraValues",        /* Redundant with kQ3ErrorParameterOutOfRange */
  164.     /* DrawContext Errors */
  165.     NULL, kQ3ErrorBadDrawContextType, "kQ3ErrorBadDrawContextType",
  166.     NULL, kQ3ErrorBadDrawContextFlag, "kQ3ErrorBadDrawContextFlag",
  167.     NULL, kQ3ErrorBadDrawContext, "kQ3ErrorBadDrawContext",
  168.     NULL, kQ3ErrorUnsupportedPixelDepth, "kQ3ErrorUnsupportedPixelDepth",
  169. #if defined(ESCHER_VER_15) && ESCHER_VER_15
  170.     /* Controller Errors */
  171.     NULL, kQ3ErrorController, "kQ3ErrorController",
  172.     /* Tracker Errors */
  173.     NULL, kQ3ErrorTracker, "kQ3ErrorTracker",
  174. #endif /* ESCHER_VER_15 */
  175.     NULL, 0, NULL
  176. };
  177.  
  178. static unsigned long    gNumWarnings = 0;
  179. static ErrorLookup         gWarningLookup[] =
  180. {
  181.     NULL, kQ3WarningNone, "kQ3WarningNone",
  182.     /* General System */
  183.     NULL, kQ3WarningInternalException, "kQ3WarningInternalException",    
  184.     /* Object Warnings */
  185.     NULL, kQ3WarningNoObjectSupportForDuplicateMethod, "kQ3WarningNoObjectSupportForDuplicateMethod",
  186.     NULL, kQ3WarningNoObjectSupportForWriteMethod, "kQ3WarningNoObjectSupportForWriteMethod",
  187.     NULL, kQ3WarningNoObjectSupportForReadMethod, "kQ3WarningNoObjectSupportForReadMethod",
  188.     NULL, kQ3WarningNoObjectSupportForDrawMethod, "kQ3WarningNoObjectSupportForDrawMethod",
  189.     NULL, kQ3WarningUnknownElementType, "kQ3WarningUnknownElementType",
  190.     NULL, kQ3WarningTypeAndMethodAlreadyDefined, "kQ3WarningTypeAndMethodAlreadyDefined",
  191.     NULL, kQ3WarningTypeIsOutOfRange, "kQ3WarningTypeIsOutOfRange",
  192.     NULL, kQ3WarningTypeHasNotBeenRegistered, "kQ3WarningTypeHasNotBeenRegistered",
  193.     /* Parameter Warning (was missing) */
  194.     NULL, kQ3WarningVector3DNotUnitLength, "kQ3WarningVector3DNotUnitLength",
  195.     /* IO Warnings */
  196.     NULL, kQ3WarningInvalidSubObjectForObject, "kQ3WarningInvalidSubObjectForObject",
  197.     NULL, kQ3WarningInvalidHexString, "kQ3WarningInvalidHexString",
  198.     NULL, kQ3WarningUnknownObject, "kQ3WarningUnknownObject",
  199.     NULL, kQ3WarningInvalidMetafileObject, "kQ3WarningInvalidMetafileObject", /* was missing! */
  200.     NULL, kQ3WarningUnmatchedBeginGroup, "kQ3WarningUnmatchedBeginGroup", /* was missing! */
  201.     NULL, kQ3WarningUnmatchedEndGroup, "kQ3WarningUnmatchedEndGroup", /* was missing! */
  202.     NULL, kQ3WarningInvalidTableOfContents, "kQ3WarningInvalidTableOfContents",
  203.     NULL, kQ3WarningUnresolvableReference, "kQ3WarningUnresolvableReference",
  204.     NULL, kQ3WarningNoAttachMethod, "kQ3WarningNoAttachMethod",
  205.     NULL, kQ3WarningInconsistentData, "kQ3WarningInconsistentData",
  206.     NULL, kQ3WarningReadLessThanSize, "kQ3WarningReadLessThanSize", /* was missing! */
  207.     NULL, kQ3WarningFilePointerResolutionFailed, "kQ3WarningFilePointerResolutionFailed",
  208.     NULL, kQ3WarningFilePointerRedefined, "kQ3WarningFilePointerRedefined", /* was missing! */
  209.     NULL, kQ3WarningStringExceedsMaximumLength, "kQ3WarningStringExceedsMaximumLength",
  210.     /* Memory Warnings */
  211.     NULL, kQ3WarningLowMemory, "kQ3WarningLowMemory",
  212.     NULL, kQ3WarningPossibleMemoryLeak, "kQ3WarningPossibleMemoryLeak",
  213.     /* View Warnings */
  214.     NULL, kQ3WarningViewTraversalInProgress, "kQ3WarningViewTraversalInProgress",
  215.     NULL, kQ3WarningNonInvertibleMatrix, "kQ3WarningNonInvertibleMatrix",
  216.     /* Quaternion Warning */
  217.     NULL, kQ3WarningQuaternionEntriesAreZero, "kQ3WarningQuaternionEntriesAreZero",
  218.     /* Renderer Warning */
  219.     NULL, kQ3WarningFunctionalityNotSupported, "kQ3WarningFunctionalityNotSupported",
  220.     /* DrawContext Warning */
  221.     NULL, kQ3WarningInvalidPaneDimensions, "kQ3WarningInvalidPaneDimensions",
  222.     /* Pick Warning */
  223.     NULL, kQ3WarningPickParamOutside, "kQ3WarningPickParamOutside",
  224.     /* Scale Warnings */
  225.     NULL, kQ3WarningScaleEntriesAllZero, "kQ3WarningScaleEntriesAllZero", /* was missing! */
  226.     NULL, kQ3WarningScaleContainsNegativeEntries, "kQ3WarningScaleContainsNegativeEntries", /* was missing! */
  227.     /* Generic Warnings */
  228.     NULL, kQ3WarningParameterOutOfRange, "kQ3WarningParameterOutOfRange", /* was missing! */
  229.     NULL, 0, NULL
  230. };
  231.  
  232. static unsigned long    gNumNotices = 0;
  233. static ErrorLookup         gNoticeLookup[] =
  234. {
  235.     NULL, kQ3NoticeNone, "kQ3NoticeNone",
  236.     NULL, kQ3NoticeDataAlreadyEmpty, "kQ3NoticeDataAlreadyEmpty",
  237.     /* General */
  238.     NULL, kQ3NoticeMethodNotSupported, "kQ3NoticeMethodNotSupported",
  239.     NULL, kQ3NoticeObjectAlreadySet, "kQ3NoticeObjectAlreadySet",
  240.     NULL, kQ3NoticeParameterOutOfRange, "kQ3NoticeParameterOutOfRange", /* was missing! */
  241.     /* IO Notices */
  242.     NULL, kQ3NoticeFileAliasWasChanged, "kQ3NoticeFileAliasWasChanged",
  243.     /* Geometry */
  244.     NULL, kQ3NoticeMeshVertexHasNoComponent, "kQ3NoticeMeshVertexHasNoComponent",
  245.     NULL, kQ3NoticeMeshInvalidVertexFacePair, "kQ3NoticeMeshInvalidVertexFacePair",
  246.     NULL, kQ3NoticeMeshEdgeVertexDoNotCorrespond, "kQ3NoticeMeshEdgeVertexDoNotCorrespond",
  247.     NULL, kQ3NoticeMeshEdgeIsNotBoundary, "kQ3NoticeMeshEdgeIsNotBoundary",
  248.     /* Draw Context */
  249.     NULL, kQ3NoticeDrawContextNotSetUsingInternalDefaults, "kQ3NoticeDrawContextNotSetUsingInternalDefaults",
  250.     /* Lights */
  251.     NULL, kQ3NoticeInvalidAttenuationTypeUsingInternalDefaults, "kQ3NoticeInvalidAttenuationTypeUsingInternalDefaults",
  252.     NULL, kQ3NoticeBrightnessGreaterThanOne, "kQ3NoticeBrightnessGreaterThanOne", /* was missing! */
  253.     /*  Scale  */
  254.     NULL, kQ3NoticeScaleContainsZeroEntries, "kQ3NoticeScaleContainsZeroEntries", /* was missing! */
  255.     NULL, 0, NULL
  256. };
  257.  
  258. static unsigned long build_lookup(ErrorLookup *table);
  259. static char *lookup(ErrorLookup *table, unsigned long nElems, long errorCode);
  260.  
  261. static unsigned long build_lookup(ErrorLookup *table)
  262. {
  263.     unsigned long    total;
  264.     unsigned long    i, j;
  265.     TQ3Boolean        done;
  266.     
  267.     total = 0;
  268.     while (table[total].errorString != NULL) total++;
  269.     
  270.     /* Bubble sort (slow, but who cares? - you're screwing up anyway) */
  271.     
  272.     for (i = 0; i < total; i++)
  273.     {
  274.         table[i].lookup = &table[i];
  275.     }
  276.     
  277.     done = kQ3False;
  278.     
  279.     for (i = 0; i < total - 1; i++)
  280.     {
  281.         done = kQ3True;
  282.         
  283.         for (j = i + 1; j < total; j++)
  284.         {
  285.             if (table[i].errorCode > table[j].errorCode)
  286.             {
  287.                 ErrorLookup    *temp;
  288.                 
  289.                 temp = table[i].lookup;
  290.                 table[i].lookup = table[j].lookup;
  291.                 table[j].lookup = temp;
  292.                 done = kQ3False;
  293.             }
  294.         }
  295.         
  296.         if (done == kQ3True) break;
  297.     }
  298.     
  299.     return total;
  300. }            
  301.  
  302. static char *lookup(ErrorLookup *table, unsigned long nElems, long errorCode)
  303. {
  304.     long    highElem    = nElems - 1;
  305.     long    midElem        = highElem / 2;
  306.     long    lowElem        = 0;
  307.     long    direction    = 1;
  308.     static char notFound[100];
  309.         
  310.     while (    (highElem >= lowElem) &&
  311.             ((direction = (errorCode - table[midElem].errorCode))) != 0)
  312.     {
  313.         if (direction > 0)
  314.         {
  315.             lowElem = midElem + 1;
  316.         }
  317.         else
  318.         {
  319.             highElem = midElem - 1;
  320.         }
  321.         midElem = (highElem + lowElem) / 2;
  322.     }
  323.     
  324.     if (direction == 0)
  325.     {
  326. #ifdef debugging
  327.         assert(midElem <= nElems);
  328. #endif
  329.         return table[midElem].errorString;
  330.     }
  331.     else
  332.     {    
  333. #ifdef debugging
  334.         assert(lowElem <= nElems);
  335. #endif
  336.         sprintf(notFound, "Error (%ld) not found", errorCode);
  337.         return notFound;
  338.     }
  339. }
  340.  
  341.  
  342. char *getErrorString(long errorID)
  343. {
  344.     if (gNumErrors == 0)
  345.         gNumErrors = build_lookup(gErrorLookup);
  346.  
  347.     return lookup(gErrorLookup, gNumErrors, errorID);
  348. }
  349.  
  350. char *getWarningString(long errorID)
  351. {
  352.     if (gNumWarnings == 0)
  353.         gNumWarnings = build_lookup(gWarningLookup);
  354.  
  355.     return lookup(gWarningLookup, gNumWarnings, errorID);
  356. }
  357.  
  358. char *getNoticeString(long errorID)
  359. {
  360.     if (gNumNotices == 0)
  361.         gNumNotices = build_lookup(gNoticeLookup);
  362.  
  363.     return lookup(gNoticeLookup, gNumNotices, errorID);
  364. }
  365.